package Model2HomeWork;
import java.io.IOException;
import java.util.Scanner;
/**
     编程实现控制台版并支持两人对战的五子棋游戏。

    （1）绘制棋盘 - 写一个成员方法实现

    （2）提示黑方和白方分别下棋并重新绘制棋盘 - 写一个成员方法实现。

    （3）每当一方下棋后判断是否获胜 - 写一个成员方法实现。

    4）提示： 采用二维数组来模拟并描述棋盘，棋盘如下：
*/
    public class GoBang {

        // 17*17 棋盘
        private static String[][] board=new String[17][17];
        //已下棋子数目
        private static int cnt;
        //分别代表玩家1,2的棋子
        private static String[] point={" # "," @ "};
        //八方向搜索
        private static int[] dx={-1,0,-1,-1,1,1,0,1};
        private static int[] dy={0,-1,-1,1,-1,1,1,0};

        //检测输入合法话
        private static int CheckInput(int x,int y){

            if(!board[x+1][y+1].equals(" + "))
                return 0;
            if(x<1||x>16||y<1||y>16)
                return 0;
            return 1;
        }

        //检查棋子有没有超出棋盘边界
        private static int Check(int x,int y){
            if(x>16||x<1||y>16||y<1)
                return 0;
            return 1;
        }
        //检测玩家是否获胜
        private static int checkResult(int num,int x1,int y1){
            if(cnt==16*16)
                return 1;
            int x = x1 +1;
            int y = y1 +1;
            //横竖 左斜 右斜 四个方向判断是否有五个棋子连在一起
            for(int i=0;i<4;i++){
                int sum=1;

                //检查棋子的上面，左边，左上，右上
                int xx=x+dx[i];
                int yy=y+dy[i];

                while(board[xx][yy].equals(point[num]) && Check(xx,yy)==1){
                    sum++;
                    xx=xx+dx[i];
                    yy=yy+dy[i];
                }
                //检查棋子的下面，右边，右下，左下方向
                xx=x+dx[7-i];
                yy=y+dy[7-i];
                while(board[xx][yy].equals(point[num]) && Check(xx,yy)==1){
                    sum++;
                    xx=xx+dx[7-i];
                    yy=yy+dy[7-i];
                }
                //有五个一样选手的棋子，返回1
                if(sum>=5)
                    return 1;
            }
            return 0;
        }

        //初始化棋盘，棋盘上的棋子数量为0
        private static void Init(){
            cnt=0;
            for(int i=0;i<17;i++){

                for(int j=0;j<17;j++){
                    board[i][j]=" + ";
                }
            }
        }

        //打印棋盘
        private static void Print(){
            int i,j;

            for(i=0;i<17;i++){
                for(j=0;j<17;j++){
                    if(i==0 && j==0){
                        System.out.print(" " + " " + " ");
                    }else if(i==0) {
                        if (j > 10 ) {
                            System.out.print(" " + (char) (j + 86) + " ");
                        } else {
                           // System.out.print(" ");
                            System.out.print(" " + (j-1) + " ");
                        }
                    }else if(j==0){
                        if(i > 10){
                            System.out.print(" " + (char)(i + 86) + " ");
                        }else{
                            System.out.print(" " + (i-1) + " ");
                        }
                    }else{
                        System.out.print(board[i][j]);
                        //System.out.print(" ");
                    }
                }
                System.out.println();
            }
        }

        public static int run(){

            int x,y;
            Init();
            //当前棋手编号,默认0号先下
            int num=0;
            while(true){
                Print();
                System.out.print(num+1+"号玩家，请输入您下棋的坐标（格式为数字 + 空格 + 数字）: ");
                Scanner sc =new Scanner(System.in);
                while(true){
                    x=sc.nextInt();
                    y=sc.nextInt();
                    if(CheckInput(x,y)==1)
                        break;
                    System.out.print("输入坐标不合法，请重新输入： ");
                }
                board[x+1][y+1]=point[num];
                if(checkResult(num,x,y)==1){
                    Print();
                    return num+1;
                }
                num=1-num;
            }
        }

        public static void main(String[] args){

            System.out.println("---------------------------------------------------");
            int num = run();
            System.out.println("恭喜" + num + "号选手获得最终的胜利");
        }

}
